/**
 * 给定数组A，依次经过，消耗Ai生命力
 * 有K次机会可以经过但不消耗生命力
 * 初始生命力为M，问最多可以过几格
 * 
 * 想要过i格的最优方法显然是将[1...i]的前K大的数都忽略
 * 只计算其他较小的代价总和即可，如果总和小于M即可通过
 * 
 * 因此每次维护前K大与其余数之和即可，O(NlogN)。
 * 
 * 这里用了二分，因为很显然具有二分性质。
 * 对于给定mid，将[1...mid]排序，直接求和判断即可
 * 时间是O(N * logN * logN)，也可
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

int N;
llt M;
int K;
vll A;

bool check(int mid){
    if(K >= mid) return true;

    vll b(A.begin(), A.begin() + mid + 1);
    sort(b.begin(), b.end());

    __int128_t sum = 0;
    for(int i=0;i<b.size()-K;++i){
        sum += b[i];
    }
    return M > sum;
}

int proc(){
    if(K >= N) return N;

    int left = 0, right = N, mid;
    do{
        mid = (left + right) >> 1;
        if(check(mid)) left = mid + 1;
        else right = mid - 1;
    }while(left <= right);
    // cout << left << " " << right << endl;
    return right;
}

void work(){
    cin >> N >> M >> K;
    A.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> A[i];
    cout << proc() << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}